				;SYMBOL DEFINITIONS
	RTRAP=%0	;TRAP WORD SAVED HERE ON TRAP
	RSTAT=%1	;STATUS OF TRAPPING ROUTINE IS SAVED HERE
	RQSTAT=%2	;QUEUE POINTER IS SAVED FOR TRAP ROUTINE
	RQSCHP=%1	;POINTER TO WORD IN CURRENT Q IS HERE
	RQSTAP=%0	;POINTER TO HEAD OF Q BEING SERCHED IS HERE
	R0=%0
	R1=%1
	R2=%2
	R3=%3
	R4=%4
	R5=%5
	SP=%6
	STATUS=177776


				;RQSTAP = STATUS WORD Q POINTER
				;RQSCHP = STATUS WORD Q SEARCH POINTER
	MOV	#406,IDLE
ENTRY:	MOV	#340,STATUS	;SET BR7
	MOV	#QSTAHI,RQSTAP	;MOVE QUEUE STATUS
				;TABLE POINTER INTO REGISTER
REPSCH:	MOV	RQSTAP,RQSCHP
	TST	(RQSCHP)+
	BNE	ACTIVE
	TST	(RQSCHP)+	;IS THIS JOB AT AN INTERRUPT
				;LEVEL
	BMI	RETINT		;IF MINUS THEN WE ARE AT
				;AN INTERRUPT ROUTINE AT
				;THIS LEVEL
	TSTB	-(RQSCHP)	;OTHERWISE CHECK WHETHER
				;THE JOB IS IN A WAIT STATE
				;AND IS READY FOR SERVICE
	BEQ	COMPLT
	BITB	#1,(RQSCHP)	;CHECK WAIT ONLY BIT
	BEQ	NEW		;IF NO WAIT BIT THEN LOOK
				;FOR NEW JOB
DONE:	CMP	RQSTAP,#QSTALO	;IS THIS THE LAST Q
	BEQ	IDLE		;END OF LIST THEN IDLE
	SUB	#20,RQSTAP	;POINT TO NEXT LOWER Q
	BR	REPSCH		;CONTINUE SEARCH
IDLE:	BR	FIRST		;FIRST TIME IN THERE ARE NO ENTRIES IN
				;THE STACK.
	MOV	#240,IDLE	;CLEAR STACK OF THIS ENTRY
	CMP	(SP)+,(SP)+	;BUMP SP BY TWO ON REENTRY TO CLEAR PREVIOUS
FIRST:	SUB	#340,STATUS	;INTERRUPT STORED PC & STATUS WORD.
	BR	.		;DO NOTHING
ACTIVE:	TSTB	(RQSCHP)+	;CHECK COMPLETION WORD IF SET, THIS
				;MEANS ROUTINE IS READY TO RUN WITH
				;ENTRY POINT IN QUEUE.  OTHERWISE,
				;IT IS JUST AN INTERRUPTED RTN.
	BMI	COMPLT		;GO TO COMPLETION RTN
RETINT:	JSR	R5,POP		;POP REGISTERS AS THIS WAS AN
				;INTERRUPTED RTN
	RTI			;RETURN TO INTERRUPTED ROUTINE
COMPLT:	CLRB	(RQSCHP)+	;CLEAR COMPLETION WORD

	JMP	14(RQSCHP)	;JUMP TO ENTRY POINT ROUTINE MUST
				;SET ITS OWN PRIORITY LEVEL
NEW:	CMP	(RQSCHP)+,@RQSCHP	;DATAIN=DATOUT PTR:POINTS AT 6
	BEQ	DONE		;NO DATA THEN QUET
	MOV	@(RQSCHP)+,R0	;PUT DATA POINTER IN R0
	INC	-10(RQSCHP)	;SET ACTIVE WORD
	CMP	@RQSCHP,-(RQSCHP)	;CHECK FOR END OF BUFFER
	BEQ	RESET		;RESET OUTPUT BUFFER PTR
	ADD	#2,@RQSCHP	;POINT TO NEXT OUTPUT LOC.
LEAVE:	JMP	+6(RQSCHP)	;GO TO ENTRY POINT OF ROUTINE
				;POINTER AT 6 HEAR
RESET:	MOV	2(RQSCHP),@RQSCHP	;RESET DATA POINTER TO HEAD OF
				;DATA BUFFER
	BR	LEAVE		;GO TO ENTRY POINT OF REQUESTED
				;ROUTINE
				;THIS ROUTINE HANDLES
				;TRAPS TO THE MONITOR
				;THESE TRAPS CAN COME
				;FROM INTERRUPT SERVICE
				;ROUTINE OR USER RTN
TRAP:	MOVB	(SP)+,#0	;A DATA POINTER IS TRANSF.
				;THRU REG. 0
	GETPC=.-2		;RETURN PC GOES HERE
	MOV	@SP,#0
	GSTAT=.-2		;PRIORITY LEVEL HERE
	TST	(SP)+		;SET SP PROPERLY
	JSR	R5,PUSH		;SAVE REGISTERS
	MOV	GETPC,RTRAP	;PUT PC IN R0
	MOV	GSTAT,RSTAT	;PUT STAT IN R1
	MOV	-2(R0),RTRAP	;R0 LOADED WITH TRAP INST.
	BIC	#340,RSTAT	;GET STAT OF INTERRUPTED RTN
	ASR	RTRAP		;DIVIDE BY TWO
	ASR	RSTAT		;DIVIDE BY TWO
	CMP	RTRAP,RSTAT	;COMPARE REQUESTING AND
				;REQUESTED PRIORITY LEVEL
	BEQ	COMPLE		;THIS INDICATES A TIME OUT
				;REQUEST
	CMP	#160,RTRAP	;CHECK FOR SERVICE REQUEST
				;OTHER THAN 0-7
	BNE	FINISH		;THIS IMPLIES CALL FOR
				;RETURN TO MONITOR
	MOV	RTRAP,RQSTAT	;SAVE REQUESTED PRIORITY
				;CONTINUE HERE TO PUT REQUEST
				;IN 0
	ADD	#QSTALO+4,RQSTAT	;R2 NOW POINTS TO QSTATUS
				;ENTRY "DATA IN" POINTER
	MOV	@SP,@(RQSTAT)+	;PUT DATA POINTER IN THE
				;DATA Q. DATA POINTER WAS
				;IN R0
	CMP	-(RQSTAT),-4(RQSTAT)	;CHECK WHETHER CURRENT
				;POINTER IS THE LAST LOCATION
	BNE	OVRTAK		;CHECK WHETHER DANGER OF
				;OVERTAKING
	MOV	6(RQSTAT),@RQSTAT	;MOVE START OF DATA BUFFER
				;AREA TO INPUT POINTER
				;LOCATION

OVRTAK:	ADD	#2,@RQSTAT	;SET INPUT POINTER TO NEW
				;LOCATION
	CMP	(RQSTAT)+,(RQSTAT)+	;COMPARE INPUT AND OUTPUT
				;POINTER
	BEQ	ERROR		;ERROR ROUTINE AS DATA BUFFER
				;IS ABOUT TO OVERFLOW
	CMP	RTRAP,RSTAT
	BGT	BCKRTN		;IN STATUS OF REQUESTING
				;RTN IS GREATER THAN REQUESTED
				;ROUTINE THEN RETDRN TO
				;REQUESTING ROUTINE OTHERWISE
				;SIMULATE AN INTERRUPT AND GO
				;TO REQUESTED ROUTINE IF YOU
				;CAN
				;NOTE STATUS & REGISTERS OF
				;CALLING ROUTINE ARE ON THE
				;STACK
	ADD	#QSTALO,RQSTAP	;GET QSTATUS WORD Q ADDRESS
	BR	REPSCH		;GO TO MONITOR SEARCH ROUTINE
				;AT Q OF REQUESTED LEVEL
COMPLE:	ADD	#QSTALO,RQSTAP	;GET ADDRESS OF REQUIRED Q
	CLR	@(RQSTAP)+	;CLEAR ACTIVE WORD
	INC	@(RQSTAP)+	;SET COMPLETION WORD
FINISH:	ADD	#10,SP		;TAKE UNNEEDED REG. OFF
				;STACK, ALSO PC & STATUS
				;WORD
	BR	ENTRY		;GO BACK TO HEAD OF Q & START
				;SEARCH AGAIN.
BCKRTN:	JSR	R5,POP		;RETURN TO ROUTINE
	RTI			;WHICH TRAPPED
POP:	TST	(SP)+	;INCREMENT STACK POINTER
	MOV	(SP)+,R0	;RESTORE REGISTER
	MOV	(SP)+,R1
	MOV	(SP)+,R2
	MOV	(SP)+,R4
	RTS	R5

PUSH:	MOV	R4,-(SP)	;SAVE REGISTERS
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R0,-(SP)
	JMP	R5
	QSTALO=.	;START Q STATUS WORD Q HERE
	QSTAHI=.+170
	ERROR=.+200

	.END
   